package handler

import (
	"admin-nexus-backend/internal/dto"
	"admin-nexus-backend/internal/service"
	"admin-nexus-backend/pkg/response"
	"strconv"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type UserHandler struct {
	userService *service.UserService
}

func NewUserHandler(db *gorm.DB) *UserHandler {
	return &UserHandler{
		userService: service.NewUserService(db),
	}
}

// GetUserList 获取用户列表
// @Summary 获取用户列表
// @Description 分页查询用户列表
// @Tags 用户管理
// @Security ApiKeyAuth
// @Produce json
// @Param page query int true "页码"
// @Param pageSize query int true "每页数量"
// @Param username query string false "用户名"
// @Param nickname query string false "昵称"
// @Param email query string false "邮箱"
// @Param phone query string false "手机号"
// @Param status query int false "状态"
// @Success 200 {object} response.Response{data=dto.PageResult}
// @Router /api/v1/users [get]
func (h *UserHandler) GetUserList(c *gin.Context) {
	var params dto.UserQueryParams
	if err := c.ShouldBindQuery(&params); err != nil {
		response.Error(c, "参数错误")
		return
	}

	// 从上下文获取数据权限并进行类型断言
	var permission *service.UserDataPermission
	if permissionInterface, exists := c.Get("dataPermission"); exists {
		if p, ok := permissionInterface.(*service.UserDataPermission); ok {
			permission = p
		} else {
			response.Error(c, "数据权限类型错误")
			return
		}
	}

	result, err := h.userService.GetUserList(&params, permission)
	if err != nil {
		response.Error(c, "获取用户列表失败")
		return
	}

	response.SuccessWithData(c, result)
}

// GetUserByID 获取用户详情
// @Summary 获取用户详情
// @Description 根据用户ID获取用户详情
// @Tags 用户管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} response.Response{data=model.User}
// @Router /api/v1/users/{id} [get]
func (h *UserHandler) GetUserByID(c *gin.Context) {
	var req dto.IDRequest
	if err := c.ShouldBindUri(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	user, err := h.userService.GetUserByID(req.ID)
	if err != nil {
		response.Error(c, "获取用户信息失败")
		return
	}

	response.SuccessWithData(c, user)
}

// CreateUser 创建用户
// @Summary 创建用户
// @Description 创建新用户
// @Tags 用户管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param req body dto.UserCreateRequest true "用户信息"
// @Success 200 {object} response.Response
// @Router /api/v1/users [post]
func (h *UserHandler) CreateUser(c *gin.Context) {
	var req dto.UserCreateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.userService.CreateUser(&req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// UpdateUser 更新用户
// @Summary 更新用户
// @Description 更新用户信息
// @Tags 用户管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Param req body dto.UserUpdateRequest true "用户信息"
// @Success 200 {object} response.Response
// @Router /api/v1/users/{id} [put]
func (h *UserHandler) UpdateUser(c *gin.Context) {
	var uriReq dto.IDRequest
	if err := c.ShouldBindUri(&uriReq); err != nil {
		response.Error(c, "参数错误")
		return
	}

	var req dto.UserUpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.userService.UpdateUser(uriReq.ID, &req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// DeleteUser 删除用户
// @Summary 删除用户
// @Description 删除用户
// @Tags 用户管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} response.Response
// @Router /api/v1/users/{id} [delete]
func (h *UserHandler) DeleteUser(c *gin.Context) {
	var req dto.IDRequest
	if err := c.ShouldBindUri(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	// 不能删除自己
	userID := c.GetUint("userId")
	if userID == req.ID {
		response.Error(c, "不能删除自己")
		return
	}

	if err := h.userService.DeleteUser(req.ID); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// ChangePassword 修改密码
// @Summary 修改密码
// @Description 修改当前用户密码
// @Tags 用户管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param req body dto.ChangePasswordRequest true "密码信息"
// @Success 200 {object} response.Response
// @Router /api/v1/users/password [put]
func (h *UserHandler) ChangePassword(c *gin.Context) {
	userID := c.GetUint("userId")

	var req dto.ChangePasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.userService.ChangePassword(userID, &req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// UpdateProfile 更新个人资料
// @Summary 更新个人资料
// @Description 更新当前用户的个人资料
// @Tags 用户管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param req body dto.UserUpdateRequest true "用户信息"
// @Success 200 {object} response.Response
// @Router /api/v1/user/profile [put]
func (h *UserHandler) UpdateProfile(c *gin.Context) {
	userID := c.GetUint("userId")

	var req dto.UserUpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.userService.UpdateUserProfile(userID, &req); err != nil {
		response.Error(c, err.Error())
		return
	}

	response.SuccessWithData(c, nil)
}

// ResetPassword 重置密码
// @Summary 重置密码
// @Description 重置用户密码为默认密码
// @Tags 用户管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} response.Response
// @Router /api/v1/users/{id}/password/reset [put]
func (h *UserHandler) ResetPassword(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, "参数错误")
		return
	}

	// 重置密码为 Systemop@123
	req := &dto.ChangePasswordRequest{
		OldPassword: "", // 管理员重置不需要旧密码
		NewPassword: "Systemop@123",
	}

	if err := h.userService.ChangePassword(uint(id), req); err != nil {
		response.Error(c, "重置密码失败")
		return
	}

	response.SuccessWithData(c, nil)
}

// GetUserPermissions 获取用户权限
// @Summary 获取用户权限
// @Description 获取指定用户的权限列表
// @Tags 用户管理
// @Security ApiKeyAuth
// @Produce json
// @Param id path int true "用户ID"
// @Success 200 {object} response.Response{data=[]int}
// @Router /api/v1/users/{id}/permissions [get]
func (h *UserHandler) GetUserPermissions(c *gin.Context) {
	idStr := c.Param("id")
	userId, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, "参数错误")
		return
	}

	permissionIds, err := h.userService.GetUserPermissionIDs(uint(userId))
	if err != nil {
		response.Error(c, "获取用户权限失败")
		return
	}

	response.SuccessWithData(c, permissionIds)
}

// AssignUserPermissions 分配用户权限
// @Summary 分配用户权限
// @Description 为指定用户分配页面和按钮权限
// @Tags 用户管理
// @Security ApiKeyAuth
// @Accept json
// @Produce json
// @Param id path int true "用户ID"
// @Param req body dto.AssignUserPermissionRequest true "权限信息"
// @Success 200 {object} response.Response
// @Router /api/v1/users/{id}/permissions [post]
func (h *UserHandler) AssignUserPermissions(c *gin.Context) {
	idStr := c.Param("id")
	userId, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		response.Error(c, "参数错误")
		return
	}

	var req dto.AssignUserPermissionRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(c, "参数错误")
		return
	}

	if err := h.userService.AssignUserPermissions(uint(userId), req.PermissionIds); err != nil {
		response.Error(c, "分配用户权限失败")
		return
	}

	response.SuccessWithData(c, nil)
}
